import numpy as np
from scipy import stats
import pandas as pd

def read_group_data(file_path, format='csv', columns=['A', 'B', 'C']):
    """
    从CSV表格文件读取三组数据
    参数：
        file_path: 文件路径（使用原始字符串）
        columns: 各组的列名
    """
    try:
        # 读取CSV文件（自动处理中文路径）
        df = pd.read_csv(file_path, encoding='gbk')  # 中文系统常用gbk编码
        
        # 提取三组数据
        group_a = df[columns[0]].dropna().tolist()
        group_b = df[columns[1]].dropna().tolist()
        group_c = df[columns[2]].dropna().tolist()

        return group_a, group_b, group_c

    except KeyError as e:
        print(f"列名错误：请确认CSV文件中包含 {columns} 这些列")
        print(f"文件实际列名：{df.columns.tolist()}")
        exit()
    except Exception as e:
        print(f"读取文件失败: {str(e)}")
        exit()

if __name__ == "__main__":
    # 配置参数（根据实际情况修改）
    file_path = r"C:\Users\王鹏翔\Desktop\新建文件夹\medical-cases\8\8-1.csv"  # 使用原始字符串
    group_columns = ["A", "B", "C"]  # 实际列名

    # 读取数据
    group_a, group_b, group_c = read_group_data(
        file_path=file_path,
        columns=group_columns
    )

    print(f"数据读取成功：\nA组({len(group_a)}个样本): 前3个值 {group_a[:3]}\n"
          f"B组({len(group_b)}个样本): 前3个值 {group_b[:3]}\n"
          f"C组({len(group_c)}个样本): 前3个值 {group_c[:3]}\n")

    # ================== 计算逻辑 ==================
    # 计算组内平方和 (Sw)
    var_a = np.var(group_a, ddof=1)
    var_b = np.var(group_b, ddof=1)
    var_c = np.var(group_c, ddof=1)
    Sw = (var_a + var_b + var_c) * (len(group_a)-1)  # 假设每组样本量相同

    # 计算总平方和和组间平方和 (Sb)
    total = group_a + group_b + group_c
    total_var = np.var(total, ddof=1)
    total_SS = total_var * (len(total)-1)
    Sb = total_SS - Sw

    # 计算 F 值
    k = 3  # 组数
    F = (Sb / (k-1)) / (Sw / (len(total)-k))

    # 获取临界值和 p 值
    alpha = 0.05
    df_between = k - 1
    df_within = len(total) - k
    f_critical = stats.f.ppf(1 - alpha, df_between, df_within)
    p_value = 1 - stats.f.cdf(F, df_between, df_within)

    # 输出结果
    print("===== 方差分析结果 =====")
    print(f"手动计算 F 值: {F:.4f}")
    print(f"临界值 (α=0.05): {f_critical:.4f}")
    print(f"p 值: {p_value:.4e}")

    # 结论判断
    if F > f_critical:
        print("\033[1;31m结论: 拒绝 H0，不同剂量郁金对小鼠存活时间有显著影响\033[0m")
    else:
        print("\033[1;34m结论: 无法拒绝 H0，无显著影响\033[0m")

    # 验证结果
    F_anova, p_anova = stats.f_oneway(group_a, group_b, group_c)
    print(f"\nSciPy 验证结果: F={F_anova:.4f}, p={p_anova:.4e}")